package com.xd.common.util;

import java.util.regex.Pattern;

/**
 * @ClassName LicensePlateValidator
 * @Description 校验车牌号
 * @Author Zch
 * @Date 2025/7/23 星期三 9:57
 */
public class LicensePlateValidator {

    /**
     * 校验中国大陆及港澳台车牌号
     * @param plateNumber 车牌号
     * @return 是否有效
     */
    public static boolean isValidChineseLicensePlate(String plateNumber) {
        if (plateNumber == null || plateNumber.isEmpty()) {
            return false;
        }

        // 去除空格和特殊字符
        String cleanedPlate = plateNumber.toUpperCase().replaceAll("[^\\u4e00-\\u9fa5A-Z0-9]", "");

        // 尝试匹配各种车牌类型
        return isValidMainlandPlate(cleanedPlate)
                || isValidHongKongPlate(cleanedPlate)
                || isValidMacauPlate(cleanedPlate)
                || isValidTaiwanPlate(cleanedPlate);
    }

    /**
     * 校验中国大陆车牌（普通+新能源）
     */
    private static boolean isValidMainlandPlate(String plate) {
        // 普通车牌正则
        String commonPlateRegex = "^[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领][A-HJ-NP-Z]" +
                "(([0-9]{5}[DF]$)|([DF][A-HJ-NP-Z0-9][0-9]{4}$)|([0-9]{4}[DF]$)|([A-HJ-NP-Z0-9]{4}[A-HJ-NP-Z0-9挂学警港澳]$))";

        // 新能源车牌正则
        String newEnergyPlateRegex = "^[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领][A-HJ-NP-Z]" +
                "(?:[0-9]{4}|[0-9]{5}[DF])[DF]$";

        return Pattern.matches(commonPlateRegex, plate) || Pattern.matches(newEnergyPlateRegex, plate);
    }

    /**
     * 校验香港车牌
     * 格式：1-2个字母开头 + 1-4个数字 + 可选1-2个字母结尾
     * 示例：AB1234、XY123、A1234、1234A、1234AB
     */
    private static boolean isValidHongKongPlate(String plate) {
        String hkRegex = "^[A-Z]{1,2}[0-9]{1,4}[A-Z]{0,2}$|^[0-9]{1,4}[A-Z]{1,2}$";
        return Pattern.matches(hkRegex, plate);
    }

    /**
     * 校验澳门车牌
     * 格式：MA-00-00、M-00-00、00-00-MA、00-00-M
     * 或纯数字：12-34、123-45、12-345等
     */
    private static boolean isValidMacauPlate(String plate) {
        String macauRegex1 = "^(MA|M)-[0-9]{2}-[0-9]{2}$";
        String macauRegex2 = "^[0-9]{2,3}-[0-9]{2,3}$";
        String macauRegex3 = "^[0-9]{2}-[0-9]{2}-(MA|M)$";
        return Pattern.matches(macauRegex1, plate)
                || Pattern.matches(macauRegex2, plate)
                || Pattern.matches(macauRegex3, plate);
    }

    /**
     * 校验台湾车牌
     * 格式：1-2个字母 + 2-4个数字 + 可选1-2个字母
     * 示例：ABC-1234、AB-123、1234-AB
     */
    private static boolean isValidTaiwanPlate(String plate) {
        String twRegex = "^[A-Z]{1,2}[0-9]{2,4}[A-Z]{0,2}$|^[0-9]{4}[A-Z]{1,2}$";
        return Pattern.matches(twRegex, plate);
    }

    public static void main(String[] args) {
        boolean lm = isValidChineseLicensePlate("闽K246OP");
        System.out.println(lm);
    }
}
